﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CCL.Utility;

namespace CCL.SocketMessage.Request
{
    /// <summary>
    /// 프로젝트를 등록을 요청하는 Message의 Body를 제공합니다.
    /// </summary>
    public class RegistProject : Body
    {
        /// <summary>
        /// 등록하고자 하는 Project 이름을 가져옵니다.
        /// </summary>
        public char[] ProjectName { get; private set; }

        /// <summary>
        /// Project의 소유자의 고유 ID를 가져옵니다.
        /// </summary>
        public int ProjectOwnerID { get; private set; }

        /// <summary>
        /// 새로운 RegistProject 객체를 생성합니다.
        /// </summary>
        /// <param name="projectName">등록하고자 하는 Project 이름</param>
        /// <param name="projectOwnerID">Project의 소유자 ID</param>
        public RegistProject(string projectName, int projectOwnerID)
        {
            ProjectName = StringUtility.StringCopy(projectName, Constant.Length.ProjectName);
            ProjectOwnerID = projectOwnerID;
        }

        /// <summary>
        /// 직렬화된 byte 배열을 통해 RegistProject 객체를 생성합니다.
        /// </summary>
        /// <param name="bytes">직렬화된 byte 배열</param>
        public RegistProject(byte[] bytes)
        {
            int start = 0;

            ProjectName = Encoding.Default.GetChars(bytes, start, Constant.Length.ProjectName);
            start += Constant.Length.ProjectName;

            ProjectOwnerID = BitConverter.ToInt32(bytes, start);
            start += sizeof(uint);
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public override byte[] GetByte()
        {
            byte[] bytes = new byte[GetSize()];

            int destIndex = 0;
            byte[] temp;

            temp = Encoding.Default.GetBytes(ProjectName);
            Array.Copy(temp, 0, bytes, destIndex, temp.Length);
            destIndex += temp.Length;

            temp = BitConverter.GetBytes(ProjectOwnerID);
            Array.Copy(temp, 0, bytes, destIndex, temp.Length);
            destIndex += temp.Length;

            return bytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public override uint GetSize()
        {
            return Constant.Length.ProjectName +
                sizeof(uint);
        }
    }
}
